openwrt service启动流程,从定位dynv6无法自动拉起分析开始

ifstatus wan6 | jsonfilter -e '@.l3_device' 2>/dev/null

在 OpenWrt 中,service 脚本 负责控制服务的启动和停止。脚本中包含一个名为 start 的数值,它指示服务的启动优先级。

start 数值的含义:

start 数值的常见取值范围:

设置 start 数值的注意事项:

以下是一些示例:

总结:

在 OpenWrt 系统中,/etc/rc.d 目录下存放着各种服务的启动脚本。这些脚本的文件名以 SK 开头,分别表示服务的 启动停止

S 和 K 的含义:

文件名格式:

示例:

注意:

部分需要关注的命令ifstatus,ubus,jsonfilter

1.分析启动优先级比较高,启动阶段,依赖的device还未完全初始化完成
2.最末优先级时刻依赖的device还未初始化完成,需要在start入口函数先主动sleep 30s
3.reboot 路由器,dynv6服务sleep 30s即可正常,在这个时间段wan6获取到公网ipv6地址
4.下电上电的情况的话等到dynv6服务(start=299)启动阶段到wan6获取到公网ipv6地址需要7mins左右,所以设置dynv6服务器在start函数入口先sleep 10m保证在机器获取到公网ipv6地址之后再进行ipv6地址同步到dynv6

  1. 服务器启动时候的命令是bash /etc/rc.common servicepath boot

Pasted image 20240406085614.png

考虑到/usr/bin/dynv6-update.sh脚本是bash -e,所以不能直接

Pasted image 20240406094925.png

几个注意的点

  1. init启动的几个service是同步进行的,A依赖B的话,A的START值可以设置大于B,对于在init.d中需要执行的一些耗时的操作需要在后台进行,否者存在依赖关系可能导致一些进程没法正常启动(之前没有后台启动导致网页服务没有启动,也一直没发获取到ipv6)
  2. 对于脚本中的shellbang中加上了-e的选项之后,命令中存在返回值非0的操作都会导致进程退出,所以不能使用echo $?的方式来判断上一个命令是否
  3. 对于日志定位的话可以在脚本开头加上`exec > /root/dynv6.log 2&1>